package cn.leedsoft.luma.test.java_base;

/**
 * java 初始化顺序:
 * 1、类加载:
 * 自上而下的顺序，执行静态成员变量初始化、static静态初始化代码块
 * 2、new对象：
 * 2.1、自上而下的顺序，执行实例成员变量初始化、实例初始化代码块
 * 2.2、调用构造方法
 * 3、如果存在继承结构时，
 * 无论类加载还是new对象，都是自上而下的。
 * Created by Administrator on 2017/5/27.
 */
public class InitOrder {

    static final String NAME = "name";

    static {//多个相同类型的代码块内部执行顺序，都是自上而下。
        System.out.println("init static 1");
        System.out.println(NAME);
    }

    static String NAME2 = "name";//多个相同类型的代码块内部执行顺序，都是自上而下。


    int age = 12;

    {
        System.out.println("init instance 1");
        age = 21;
        System.out.println(age);
    }

    int age2 = 12;//多个相同类型的代码块内部执行顺序，都是自上而下。


    static {//多个相同类型的代码块内部执行顺序，都是自上而下。
        System.out.println("init static 2");
    }


    {
        System.out.println("init instance 2");
    }

    public InitOrder() {
        System.out.println(NAME);
        System.out.println(NAME2);
        System.out.println(age);
        System.out.println(age2);
        System.out.println("constructor ....");
    }

    public static void main(String[] args) {
        new InitOrder();
    }
}

class SubInitOrder extends InitOrder {
    public SubInitOrder() {
        System.out.println("SubInitOrder constructor");
    }

    static {
        System.out.println("SubInitOrder static...");
    }

    {
        System.out.println("SubInitOrder instance...");
    }

    public static void main(String[] args) {
        new SubInitOrder();
    }
}
